package com.lagou.educourseboot.service.impl;

import com.lagou.educourseboot.entity.Course;
import com.lagou.educourseboot.mapper.CourseMapper;
import com.lagou.educourseboot.service.CourseService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class CourseServiceImpl implements CourseService {

    @Autowired
    private CourseMapper courseMapper;

    //注入redis的帮助类
    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    public List<Course> getAllCourse() {
        //将redis内存中的序列化的集合名称用String重新命名（增加可读性）
        RedisSerializer rs = new StringRedisSerializer();
        redisTemplate.setKeySerializer(rs);
        //1.去redis查询数据集合
        //去redis中获取名为allCourses的数据集合
        System.out.println("--------------------->>>查询redis");
        List<Course> list= (List<Course>) redisTemplate.opsForValue().get("allCourses");
        //2.如果redis中没有 就去mysql数据中查询
        //判断：如果list拿回来的数据是空值 就去mysql中查询数据
        if (list == null){
            //使用双层检测锁来解决高并发问题 只查询一次mysql 剩下的都是查询redis
            synchronized (this){
                //再次在redis中查询一遍
                list= (List<Course>) redisTemplate.opsForValue().get("allCourses");
                //如果还是没有就去mysql中查询
                if (list == null){
                    System.out.println("====查询mysql=====");
                    list = courseMapper.getAllCourse();
                    //3.将数据集合放入redis以便下次查询使用中(key,value,过期秒数(防止内存过满),秒的工具类)
                    redisTemplate.opsForValue().set("allCourses",list,10,TimeUnit.SECONDS);
                }
            }
        }
        return list;
    }

    @Override
    public List<Course> getMyCoursesById(List<String> idList) {
        return courseMapper.getMyCoursesById(idList);
    }

    @Override
    public Course getCourseById(Integer courseid) {
        return courseMapper.getCourseById(courseid);
    }
}
